package br.com.fogas.utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class NFeUtility {

	public String geraChaveNFe(String centro, Date emissao, String cnpj, String serie, String numero, String tpEmissao) {
        String chave = "";
        
        serie = StringUtility.leftPad(serie, 3, "0");
        numero = StringUtility.leftPad(numero, 8, "0");

        if ("0100".equals(centro)) {
			chave += "13"; // Amazonas
		} else if ("0200".equals(centro)) {
			chave += "11"; // Rondonia
		} else if ("0300".equals(centro)) {
			chave += "12"; // Acre
		} else if ("0400".equals(centro)) {
			chave += "14"; // Roraima
		} else if ("0500".equals(centro)) {
			chave += "15"; // Para
		}
        
        DateFormat format = new SimpleDateFormat("ddMMyyyy");
        String emissaoStr = format.format(emissao);
        
        //AAMM da emissao (4) 
        chave += StringUtility.substring(emissaoStr, 6, 8);
        chave += StringUtility.substring(emissaoStr, 2, 4);

        //CNPJ do Emitente (14) 
        chave += StringUtility.leftPad(cnpj, 14, "0");

        //Modelo (2) 
        chave += "55";

        //Serie (3)
        chave += StringUtility.leftPad(serie, 3, "0");

        // Numero da NF-e (9) 
        chave += StringUtility.leftPad(numero, 9, "0");

        //Forma de emissao da NF-e (1) 
        chave += tpEmissao;

        //Codigo numerico (8) 
        chave += StringUtility.leftPad(numero, 8, "0");

        //Digito verificador (1) 
        chave += calcDV(chave);

        return chave;
    }
	
	private String calcDV(String chave) {
        int soma = 0;  // Vai guardar a Soma
        int mod = -1; // Vai guardar o Resto da divis�o
        int dv = -1; // Vai guardar o DigitoVerificador
        int peso = 2;  // vai guardar o peso de multiplicacao

        // Percorrendo cada caracter da chave da direita para esquerda para fazer os calculos com o pesso
        for (int i = chave.length() - 1; i != -1; i--)
        {
            int ch = Integer.valueOf(String.valueOf(chave.toCharArray()[i]));
            soma += ch * peso;
            //sempre que for 9 voltamos o pesso a 2
            if (peso < 9)
                peso += 1;
            else
                peso = 2;
        }

        //Agora que tenho a soma vamos pegar o resto da divis�o por 11
        mod = soma % 11;
        //Aqui temos uma regrinha, se o resto da divis�o for 0 ou 1 ent�o o dv vai ser 0
        if (mod == 0 || mod == 1)
            dv = 0;
        else
            dv = 11 - mod;

        return String.valueOf(dv);
    }
}
